package cn.showcon.firstapp.service;

import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentSplitter;
import dev.langchain4j.data.document.parser.TextDocumentParser;
import dev.langchain4j.data.document.splitter.*;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.ollama.OllamaChatModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.util.List;

/**
 * @Author Xue Lanbin
 */
@Slf4j
@Service
public class LlmService {

    @Value("${localai.baseURL}")
    private String baseURL;

    @Value("${localai.modelName}")
    private String modelName;

    @Value("${localai.temperature}")
    private Double temperature;

    @Value("${localai.timout.minutes}")
    private Integer timout;

    public ChatLanguageModel getModel(String format) {
        OllamaChatModel ollamaChatModel = OllamaChatModel.builder()
                .baseUrl(baseURL)
                .modelName(modelName)
                .logRequests(true)
                .logResponses(true)
                .temperature(temperature)
                .timeout(Duration.ofMinutes(timout))
                .format(format)
                .build();
        return ollamaChatModel;
    }

    public String parser() {
        // TextDocumentParser; 从文件流中读取文本
        // DocumentSplitter; 接口
//        DocumentSplitter;
//        DocumentSplitters;
        return null;
    }

    public static void main(String[] args) {
        String text2 = """
影刀RPA软件购买协议
甲方：安井食品集团股份有限公司
企业注册地址： 厦门市海沧区新阳路2508号
企业注册电话：0592-6884985
企业税号： 913502007054909195
开户行： 中国建设银行股份有限公司厦门新阳支行
账号： 3510 1595 0010 5250 0108
联系人： 施荣旭
联系地址：厦门海沧新阳街道新阳大厦21楼 
联系电话： 18250769010
联系邮箱：xurongshi@anjoyfood.com

乙方：杭州分叉智能科技有限公司
联系地址：浙江省杭州市余杭区仓前街道鼎创财富中心2幢3层303室
开户行：工行杭州余杭支行
账号：1202220909100054111
联系人：何杰
联系电话：18159512329
联系邮箱：ma.ke@yingdao.com

本协议由甲方向乙方采购乙方影刀RPA软件（以下简称：“影刀”），乙方为甲方提供相应套餐的软件使用技术指导。甲乙双方根据《中华人民共和国民法典》及其他相关法律、法规的规定，本着平等自愿的原则，经过充分协商，于杭州市余杭区达成如下协议，以资共同遵照执行。

第一条 合作内容
1．甲方向乙方购买一年期的乙方影刀RPA软件产品套餐，其中包含影刀RPA机器人账号20个，总计人民币160,000.00元，大写：壹拾陆万元整。其中未税金额为人民币141,592.92，大写：壹拾肆万壹仟伍佰玖拾贰元玖角贰分。甲方应于协议签订后5个工作日内向乙方付款。乙方应于收到款项后5个工作日内向甲方出具税率为13%的增值税专用发票。
2．乙方根据甲方购买的产品套餐，为甲方提供相应套餐的技术指导，协助甲方自行使用影刀RPA实现其业务需求。乙方向甲方提供的技术指导均基于影刀标准功能实现。
套餐包括：
a)基础功能实现或指导：
1)套餐账号的开通；
2)计划执行编排及触发支持；
3)创建专属市场支持；
4)机器人调度能力；
5)电脑端自动化能力；
6)手机端自动化能力；
7)控制台能力（实现套餐账号的统一管理、角色权限设置、异常情况监控、操作及运行记录等）。
b)附加支持：
1)高级技术专家全年技术指导支持；
2)企业专属线上集中培训；
3)提供需求挖掘和评估等技术支持。
3．为了使甲方能够更好的实现需求功能，乙方在标准的RPA服务能力之外还提供第三方扩展服务供甲方自主选择使用，如：OCR、NLP、验证码识别等，此类扩展服务通常需按调用次数付费，具体资费以软件产品中显示为准。

第二条 甲方的权利和义务
1．甲方必须严格按照本合同约定向乙方支付协议款项及其他有关费用。
2．为了更好的实现甲方需求，甲方应尽可能全面、详尽地提供甲方公司的管理现状和业务需求。甲方保证所提出的业务需求符合法律法规、规章制度的有关规定，不侵害任何第三方的合法权益，否则乙方有权拒绝提供相应服务；如因甲方原因导致乙方受到第三方维权、政府部门处罚等，由甲方赔偿乙方因此造成的全部损失。
3．非经乙方书面同意，甲方不得向任何第三方透露本合作的任何内容。
4．甲方应及时续费，避免因欠费导致合作终止而遭受损失。
5．甲方承诺不进行下列行为，否则乙方有权立即关停账号，并由甲方承担由此给乙方造成的一切损失：
a)利用影刀散布不受欢迎的电子邮件、广告等SPAM等；
b)利用影刀进行干扰或扰乱乙方的网络技术或侵害任何第三方权益的行为；
c)其他可能给乙方带来不利影响或者违反国家法律法规、规章制度的行为。
6．甲方不得向任何第三方透露在乙方公司（包括其分支机构、控股公司和合资公司）知悉的商业秘密，包括业务技术秘密、市场秘密、财务秘密，管理秘密及其他方面的秘密信息，甲方信息泄露的，乙方有权追究甲方的法律责任。已获得乙方授权或书面同意的除外。

第三条 乙方的权利和义务
1．乙方保证其所提供影刀产品的合法性。
2．乙方在因软件系统升级或数据备份而导致技术中断时，应及时通知甲方。
3．乙方应严格按照本协议的约定为甲方提供影刀相关技术指导。
4．乙方不得向任何第三方透露在甲方公司（包括其分支机构、控股公司和合资公司）知悉的商业秘密，包括业务技术秘密、市场秘密、财务秘密，管理秘密及其他方面的秘密信息，乙方信息泄露的，甲方有权追究乙方的法律责任。已获得甲方授权或书面同意的除外。

第四条 知识产权的归属
1．本协议中所指的影刀RPA软件为乙方开发并所有。软件的一切版权、商标权、专利权、商业秘密等知识产权，以及与软件相关的所有信息内容，包括但不限于：文字表述及其组合、图标、图饰、图表、色彩、界面设计、版面框架、有关数据、印刷材料、或电子文档等均受中华人民共和国著作权法、商标法、专利法、反不正当竞争法和相应的国际条约以及其他知识产权法律法规的保护，乙方享有上述知识产权。
2．未经乙方书面同意，甲方不得为任何营利性或非营利性的目的自行披露、使用、实施、利用、转让或许可任何三方披露、使用、实施、利用、转让上述知识产权，乙方保留追究上述未经许可行为的权利。

第五条 违约责任
1．任一方未按本协议约定履行义务的，每迟延一天应按照合同金额的千分之五向守约方支付违约金，累计迟延履行超过30日的，守约方有权书面通知违约方解除本协议，并要求违约方承担相当于协议总金额20%的违约金，如违约金不足以弥补损失的，应当继续弥补损失。
2．违约方除向守约方赔偿并支付协议约定的违约金外，还须承担另一方为取得此等赔偿而支出的所有费用，包括但不限于仲裁费、诉讼费、律师费、保全费、公证费、差旅费等。

第六条 不可抗力
1．“不可抗力”是指协议双方不能合理控制、不可预见或即使预见亦无法避免的事件，该事件妨碍、影响或延误任何一方根据协议履行其全部或部分义务。该事件包括但不限于政府行为、自然灾害、战争或任何其它类似事件。
2．本协议有效期内由于不可抗力导致乙方不能提供服务时，乙方不承担任何责任。但乙方应在合理的时间内及时向甲方报告该情况，并提供相关资料证实出现不可抗力的事实。
3．若发生不可抗力时，乙方与甲方进行协商，并依据不可抗力发生情况协商确定是否解除本协议或延迟委托业务的各项业务的完成期限。对于已完成的协议项目，甲方应当接受并给付乙方相应的费用。

第七条 争议解决
双方在执行本协议过程中发生争议，应首先协商解决。如协商不成双方同意将因执行本协议或与本协议有关的一切争议提交至协议签订地人民法院起诉解决。

第八条 协议的解除
在下列情况下，双方可变更或解除协议：
a)经双方当事人协商同意；
b)协议订立时依据的客观情况发生重大变化，致使协议无法履行；
c)因不可抗力致使协议无法履行；
d)一方当事人严重违约致使协议履行成为不必要时；
e)甲方欠费超过15日未能足额支付的，乙方可随时终止本协议；
f)其他法律法规、规章制度规定的情况。

第九条 协议期限
1．本协议有效期从【 2024 】年【 7 】月【 03 】日起至【  2025  】年【 7 】月【  02  】日止。
2．有效期满后，如甲方没有续费的，乙方有权关闭甲方使用的影刀账号并且不再提供技术指导或支持。
3．甲方要求对本协议续期的，应至少在本协议期限届满前一个月向乙方提出，并签订续费协议支付相应的费用。

第十条 协议生效及其他
1．本协议一式两份，甲乙双方各执一份，具有同等法律效力，自双方签字/盖章后生效。
2．本协议首部当事人名称、联系方式和联系信息适用于双方往来联系、书面文件送达及争议解决时法律文书送达。一方当事人变更名称、联系方式和联系信息的，应当在变更后3日内及时书面通知对方当事人，对方当事人实际收到变更通知前的送达仍为有效送达，电子送达与书面送达具有同等法律效力。因首部当事人名称、联系方式和联系信息错误而无法直接送达的自交邮后第7日视为送达。
3．合同送达条款与争议解决条款均为独立条款，不受合同整体或其他条款的效力的影响。
4．本协议未尽事宜，经过双方充分协商可以签订补充协议，补充协议与本协议具有同等法律效力。


甲方(盖章)：

甲方代表签字： 

签署日期：     年     月    日 

	乙方(盖章)：

乙方代表签字： 

签署日期：  2024  年  5 月  24  日 


附件一： 

网络信息安全承诺书
致杭州分叉智能科技有限公司：
本人（本公司）郑重承诺遵守本承诺书的有关条款，如有违反本承诺书有关条款的行为，由本人（本公司）承担由此带来的一切民事、行政和刑事责任。
一、本人（本公司）承诺遵守《中华人民共和国计算机信息系统安全保护条例》和《计算机信息网络国际联网安全保护管理办法》及其他国家有关法律、法规和行政规章制度。
二、本人（本公司）已知悉并承诺遵守《电信业务经营许可管理办法》、《互联网IP地址备案管理办法》、《非经营性互联网信息技术备案管理办法》、等国家相关部门有关文件的规定。
三、本人（本公司）保证不利用网络危害国家安全、泄露国家秘密，不侵犯国家的、社会的、集体的利益和第三方的合法权益，不从事违法犯罪活动。
四、本人（本公司）承诺严格按照国家相关的法律法规做好本人（本公司）网站的信息安全管理工作，按政府有关部门要求设立信息安全责任人和信息安全审查员。
五、本人（本公司）承诺健全各项网络安全管理制度和落实各项安全保护技术措施。
六、本人（本公司）承诺不制作、复制、查阅和传播下列信息： 1、反对宪法所确定的基本原则的； 2、危害国家安全，泄露国家秘密，颠覆国家政权，破坏国家统一的； 3、损害国家荣誉和利益的； 4、煽动民族仇恨、民族歧视，破坏民族团结的； 5、破坏国家宗教政策，宣扬邪教和封建迷信的； 6、散布谣言，扰乱社会秩序，破坏社会稳定的； 7、散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的； 8、侮辱或者诽谤他人，侵害他人合法权益的； 9、含有法律、行政法规禁止的其他内容的。
七、本人（本公司）承诺不从事下列危害计算机信息网络安全的活动： 1、未经允许，进入计算机信息网络或者使用计算机信息网络资源的； 2、未经允许，对计算机信息网络功能进行删除、修改或者增加的； 3、未经允许，对计算机信息网络中存储或者传输的数据和应用程序进行删除、修改或者增加的； 4、故意制作、传播计算机病毒等破坏性程序的； 5、其他危害计算机信息网络安全的。
八、本人（本公司）承诺当计算机信息系统发生重大安全事故时，立即采取应急措施，保留有关原始记录，并在24小时内向政府监管部门报告并书面知会贵单位。
九、若违反本承诺书有关条款和国家相关法律法规的，本人（本公司）直接承担相应法律责任，造成财产损失的，由本人（本公司）直接赔偿，与你单位无涉，且你单位有权停止产品使用和技术支持。
""";
        Document document = Document.from(text2);

//        DocumentSplitter documentSplitter = DocumentSplitters.recursive(2000, 500);
        DocumentSplitter documentSplitter = new DocumentByCharacterSplitter(50, 0);
        List<TextSegment> list = documentSplitter.split(document);
        System.out.println(list.size());
        for (TextSegment item : list) {
            System.out.println(item);
            System.out.println("");
            System.out.println("");
            System.out.println("");
            System.out.println("");
            System.out.println("---------------------------------------------");
        }
    }
}
